package com.zhang.zxx.boot.common.exception;


/**
 * ProcessControlThrowable:用于流程控制的可抛出类[循环内部抛异常]不会记录异常堆栈，不会有额外的性能损耗
 *
 * @author zhangxiaoxiang
 * @date 2021年11月27日
 */
public class ProcessControlThrowable extends Throwable {

    private final Object controlMsg;

    /**
     * 可存储任意对象的构造方法
     *
     * @param controlMsg Object
     */
    public ProcessControlThrowable(Object controlMsg) {
        super();
        this.controlMsg = controlMsg;
    }

    @Override
    public String getMessage() {
        if (controlMsg instanceof String) {
            return (String) controlMsg;
        }
        return null;
    }

    public <T> T getControlMsg() {
        return (T) controlMsg;
    }

    /**
     * <p>丢弃异常信息，以减少填充异常堆栈带来的性能损耗</p>
     *
     * @return this
     */
    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}
